from PIL import Image, ImageDraw, ImageFont, ImageFilter


def char_painting():
    # 生成字符画
    def transform1(img_f, c_lib):
        # 转换为黑白图片，参数"L"表示黑白模式
        img_f = img_f.convert("L")
        code_pic = ''
        # size属性表示图片的分辨率，'0'为横向大小，'1'为纵向
        for h in range(0, img_f.size[1]):
            for w in range(0, img_f.size[0]):
                # 返回指定位置的像素，如果所打开的图像是多层次的图片，那这个方法就返回一个元组
                gray = img_f.getpixel((w, h))
                # 建立灰度与字符集的映射,灰度图只有一个0-255，根据灰度值占比取出字符内容
                code_pic = code_pic + c_lib[int(((count - 1) * gray) / 256)]
            code_pic = code_pic + '\r\n'
        return code_pic

    def transform2(img_f, c_lib):
        code_pic = ''
        for h in range(0, img_f.size[1]):
            for w in range(0, img_f.size[0]):
                g, r, b, a = img_f.getpixel((w, h))
                # 生成彩图占比数据，使用灰度算法
                gray = int(r * 0.299 + g * 0.587 + b * 0.114)
                # 根据灰度值占比取出字符内容
                code_pic = code_pic + c_lib[int(((count - 1) * gray) / 256)]
            code_pic = code_pic + '\r\n'
        return code_pic

    # 生成字符画所需的字符集
    code_lib = """@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\\\\|()1{}[]?-_+~<>i!lI;:,"^`'. """
    count = len(code_lib)

    # 处理图片
    with open(u'1.png', 'rb') as fp:
        image_file = Image.open(fp)
        # 调整图片大小
        image_file = image_file.resize((int(image_file.size[0] * 0.75), int(image_file.size[1] * 0.5)))
        print(u'Info:', image_file.size[0], ' ', image_file.size[1], ' ', count)

    with open('1.txt', 'w') as tmp:
        # 转换到text文本
        tmp.write(transform2(image_file, code_lib))
        tmp.write(transform1(image_file, code_lib))
